EIP-4973 を理解したい
Ethereum、EIP-4973、ERC-4973
https://eips.ethereum.org/EIPS/eip-4973
https://github.com/rugpullindex/ERC4973/blob/master/src/ERC4973.sol
EIP を読む
まずは https://eips.ethereum.org/EIPS/eip-4973 を読もう。
EIP-4973: Account-bound Tokens
An interface for non-transferrable NFTs binding to an Ethereum account like a legendary World of Warcraft item binds to a character.
とのことで、Soulbound Token 的なことを表現したいように思える。
概念的な Soul を扱うのはたいへんだから、まずは少なくとも Account に紐づけるような堅実な実装を目指している印象。
関数のインターフェイスは以下の通り。ERC-721 と比べると transfer 系がないのがわかる。
code:memo1.sol
function balanceOf(address owner) external view returns (uint256);
function ownerOf(uint256 tokenId) external view returns (address);
function unequip(uint256 tokenId) external;
function give(address to, string calldata uri, bytes calldata signature) external returns (uint256);
function take(address from, string calldata uri, bytes calldata signature) external returns (uint256);
give と take があるってことは、二者間の合意にもとづいた受け渡しはできるってことかね〜。
unequip がとても重要そうな印象を受ける。が、説明を読んでもよくわからなかった。
実装を読む
https://github.com/rugpullindex/ERC4973/blob/master/src/ERC4973.sol を読んでみよう。
code:memo2.sol
import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
import {EIP712} from "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol";
import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import {BitMaps} from "@openzeppelin/contracts/utils/structs/BitMaps.sol";
知らないことだらけだ。
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/SignatureChecker.sol
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/EIP712.sol
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/structs/BitMaps.sol
知らないことは、別途で理解を進めていく。
EIP-165 を理解したい
EIP-712 を理解したい
関数 unequip は「トークンを捨てる」みたいな感じかねぇ。英単語 equip の否定形で「装備を外す」的な? Account-bound Tokens において装備を外すってのはそのトークンは誰にも使えなくなる、って理解で合っているだろうか。
code:memo3.sol
function unequip(uint256 tokenId) public virtual override {
require(msg.sender == ownerOf(tokenId), "unequip: sender must be owner");
_usedHashes.unset(tokenId);
_burn(tokenId);
}
まとめ
transfer のように一方的に送りつけたりはできないっぽい
give と take によって、双方の合意のもとに受け渡しすることはできるっぽい?
unequip によって誰も二度と使えない状態にできるっぽい
ここから先は、ERC-4973 を実装したトークンを発行して誰かといっしょに触ってみるのがいいだろう。